package features.advance.leetcode.array.easy;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 剑指 Offer 61. 扑克牌中的顺子
 *
 * 难度：简单
 *
 * 从扑克牌中随机抽5张牌，判断是不是一个顺子，即这5张牌是不是连续的。2～10为数字本身，
 * A为1，J为11，Q为12，K为13，而大、小王为 0 ，可以看成任意数字。A 不能视为 14。
 *
 *
 *
 * 示例 1:
 *
 * 输入: [1,2,3,4,5]
 * 输出: True
 *
 *
 * 示例 2:
 *
 * 输入: [0,0,1,2,5]
 * 输出: True
 *
 *
 * 限制：
 *
 * 数组长度为 5
 *
 * 数组的数取值为 [0, 13] .
 *
 * @author LIN
 * @date 2021-06-23
 */
public class Offer61 {

    public static void main(String[] args) {
        Solution solution = new Solution() {
            /**
             * 排序
             * @param nums
             * @return
             */
            @Override
            public boolean isStraight(int[] nums) {
                Arrays.sort(nums);
                int joker = 0;
                for (int i = 0; i < nums.length - 1; i++) {
                    if(nums[i] == 0){
                        joker++;
                    }else if (nums[i] == nums[i+1]){
                        return false;
                    }
                }
                return nums[4] - nums[joker] < 5;
            }
        };
        int[] nums = {0,0,1,2,5};
        boolean straight = solution.isStraight(nums);
        System.out.println(straight);



    }

    static class Solution {
        /**
         * 集合Set
         *
         * 根据题意，此 55 张牌是顺子的 充分条件 如下：
         *
         * 除大小王外，所有牌 无重复 ；
         * 设此 55 张牌中最大的牌为 maxmax ，最小的牌为 minmin （大小王除外），
         * 则需满足：
         * max - min < 5
         * max−min<5
         *
         * 因而，可将问题转化为：此 55 张牌是否满足以上两个条件
         *
         * @param nums
         * @return
         */
        public boolean isStraight(int[] nums) {
            if(nums == null || nums.length != 5){
                return false;
            }
            int max = 0,min = 13;
            Set<Integer> set = new HashSet<>();
            for (int num : nums) {
                if(num == 0) continue;
                if(set.contains(num)) return false;
                set.add(num);
                max = Math.max(max,num);
                min = Math.min(min,num);
                if(max - min >= 5) return false;
            }
            return max - min < 5;

        }
    }
}

